S01-05 Servlet-路径
[TOC]
JavaWeb 工程路径指在 Web 容器(如 Tomcat)运行环境中,定位页面、静态资源(CSS/JS/图片)、Servlet 及配置文件的寻址规则。解析路径的核心在于明确解析执行方是浏览器还是服务器。
路径本质与工程结构
Web 工程在容器中部署后,虚拟路径与物理磁盘路径存在映射关系。
- Web 根目录(WebContent / webapp):对外公开的根目录,包含静态资源、首页
index.jsp等。映射为应用的上下文路径(Context Path)。 - WEB-INF 目录:受保护目录,客户端浏览器无法通过 URL 直接访问,仅允许服务端内部转发访问。
- URL 映射关系:访问地址
http://localhost:8080/工程名/资源路径中,/工程名对应 WebContent 目录本身。

相对路径
相对路径不以斜杠 / 开头,其寻址完全基于浏览器当前地址栏中的 URL 进行计算推导。
寻址规则
./或直接写资源名:基于当前目录寻址。../:回退到上一级目录寻址。
转发陷阱
当服务端执行转发时,浏览器地址栏的 URL 保持不变,但页面实际所在的层级已经改变。若页面内使用相对路径引用资源,会导致浏览器以错误的基准路径发起请求,产生 404 错误。
// 请求转发后浏览器地址栏不变,会导致页面内的相对路径基准发生偏移
request.getRequestDispatcher("/views/detail.jsp").forward(request, response);客户端绝对路径
所有交由浏览器解析的路径均属于客户端路径,包括 HTML 标签属性(href、src、action)、CSS 中的 url()、JavaScript 中的跳转以及服务端的重定向 sendRedirect()。
斜杠含义
客户端路径中的首个斜杠 / 被浏览器解析为服务器主机根目录:
/ 映射为:http://localhost:8080/编写规范
必须显式包含工程上下文路径(Context Path),否则请求会跨越到工程外部。
| 场景 | 错误写法(404) | 正确写法 |
|---|---|---|
| 表单提交 | <form action="/login"> | <form action="/工程名/login"> |
| 静态资源 | <img src="/img/logo.png"> | <img src="/工程名/img/logo.png"> |
| 重定向 | response.sendRedirect("/index.jsp") | 见下方代码示例 |
// 客户端重定向由浏览器发起新请求,必须手动拼装工程路径
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/login.jsp");服务端绝对路径
所有交由Web 容器(服务器)解析的路径属于服务端路径,包括 request.getRequestDispatcher()、ServletContext 获取资源、web.xml 中的 <url-pattern> 以及注解 @WebServlet。
斜杠含义
服务端路径中的首个斜杠 / 被容器解析为当前 Web 应用的根目录:
/ 映射为:http://localhost:8080/工程名/编写规范
严禁拼接工程名。若多写了工程名,服务器会将其识别为工程内部的一个子目录。
// 服务端跳转由容器直接解析为工程根目录,不可拼接工程名
request.getRequestDispatcher("/pages/user.jsp").forward(request, response);统一路径方案
硬编码工程名会导致项目重命名或部署为根上下文时大面积失效。实际开发中通常采用以下标准流程来消除路径硬编码:
动态获取工程路径:在 JSP 页面或模版中使用 EL 表达式
${pageContext.request.contextPath}动态输出上下文名称。基准路径标签法:在 HTML 的
<head>区域声明<base>标签,将整个页面的相对路径基准锚定在工程根目录下。前台资源引用:所有超链接与资源加载均使用绝对路径拼接模式。
jsp<% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <head> <base href="<%=basePath%>"> </head>
物理与类路径
在 Java 后台代码中读写磁盘文件或加载配置文件时,涉及物理路径与 Classpath 路径。
磁盘物理绝对路径
Web 资源部署在磁盘上的真实存储位置,可通过 ServletContext 进行动态映射。
// 获取工程资源在宿主机磁盘上的绝对物理路径
String realPath = request.getServletContext().getRealPath("/upload");类加载器路径
读取 src 源码目录(编译后进入 WEB-INF/classes)下的配置文件时,必须脱离 Web 容器路径,使用类加载器读取。
// 类加载器从 classpath 根路径加载配置文件输入流
InputStream in = DbUtil.class.getClassLoader().getResourceAsStream("db.properties");